// models/user.model.js
import { pool } from "../connect/db.js";

/**
 * User 类表示一个用户实体，并提供静态方法来与数据库进行交互。
 */
class User {
    /**
     * 创建一个新的 User 实例。
     * @param {Object} data - 包含用户数据的对象。
     * @param {number} data.id - 用户的唯一标识符。
     * @param {string} data.name - 用户的名字。
     * @param {string} data.email - 用户的电子邮件地址。
     */
    constructor(data) {
        this.id = data.id;
        this.name = data.name;
        this.email = data.email;
    }

    /**
     * 在数据库中创建一个新的用户。
     * @param {Object} userData - 包含用户数据的对象。
     * @param {string} userData.name - 用户的名字。
     * @param {string} userData.email - 用户的电子邮件地址。
     * @returns {Promise<User|null>} - 创建的用户实例或 null。
     */
    static async create({ name, email }) {
        const result = await pool.query(
            'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *',
            [name, email]
        );
        return new User(result.rows[0]);
    }

    /**
     * 根据用户 ID 查找用户。
     * @param {number} id - 用户的唯一标识符。
     * @returns {Promise<User|null>} - 找到的用户实例或 null。
     */
    static async findById(id) {
        const result = await pool.query('SELECT * FROM users WHERE id = $1', [id]);
        if (result.rows.length) {
            return new User(result.rows[0]);
        }
        return null;
    }

    /**
     * 根据电子邮件地址查找用户。
     * @param {string} email - 用户的电子邮件地址。
     * @returns {Promise<User|null>} - 找到的用户实例或 null。
     */
    static async findByEmail(email) {
        const result = await pool.query('SELECT * FROM users WHERE email = $1', [email]);
        if (result.rows.length) {
            return new User(result.rows[0]);
        }
        return null;
    }

    /**
     * 根据用户 ID 更新用户信息。
     * @param {number} id - 用户的唯一标识符。
     * @param {Object} userData - 包含要更新的用户数据的对象。
     * @param {string} [userData.name] - 用户的名字。
     * @param {string} [userData.email] - 用户的电子邮件地址。
     * @returns {Promise<User|null>} - 更新后的用户实例或 null。
     */
    static async updateById(id, { name, email }) {
        const result = await pool.query(
            'UPDATE users SET name = $1, email = $2 WHERE id = $3 RETURNING *',
            [name, email, id]
        );
        if (result.rows.length) {
            return new User(result.rows[0]);
        }
        return null;
    }

    /**
       * 获取所有用户。
       * @returns {Promise<User[]>} - 用户实例数组。
       */
    static async findAll() {
        const result = await pool.query('SELECT * FROM users ORDER BY id ASC');
        return result.rows.map(row => new User(row));
    }

    /**
     * 根据用户 ID 删除用户。
     * @param {number} id - 用户的唯一标识符。
     * @returns {Promise<User|null>} - 被删除的用户实例或 null。
     */
    static async deleteById(id) {
        const result = await pool.query('DELETE FROM users WHERE id = $1 RETURNING *', [id]);
        if (result.rows.length) {
            return new User(result.rows[0]);
        }
        return null;
    }
}

export default User;